/******************************************************************************\
 *                                                                              *
 *     File: Dierentuin_cc                                                      *
 *                                                                              *
 *   Author: Jan Meuleman / Douwe A. van Twillert                               *
 *  Purpose: de definitie (implementatie) van de klasse Dierentuin              *
 *  Version: 1.0      MEM 20020124                                              *
 *           - eerste versie                                                    *
 *  Version: 1.1      TWI 20080218                                              *
 *           - header aangepast voor duidelijk kunnen printen                   *
 *           - kleine aanpassingen om het half werkend te krijgen               *
 *                                                                              *
\******************************************************************************/

#include "Dierentuin.h"

/*
 *   Constructor
 */
Dierentuin::Dierentuin(string een_naam) {
    de_naam = een_naam;
    werknemers = new map<int, Werknemer*>();
    beschikbareWerknemerNummers = new vector<int>;
    beschikbareDierNummers = new vector<int>;
    dieren = new map<int, Dier*>();
    kooien = new map<string, Kooi*>();
    hoogsteDierNummer = 0;
    hoogsteWerknemernummer = 0;

    fillVectors();
}

/*
 *   Destructor
 */
Dierentuin::~Dierentuin() {
    for(map<int, Werknemer*>::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter){
        delete (*iter).second;
    }
    for(map<int, Dier*>::iterator iter = dieren->begin(); iter != dieren->end(); ++iter){
        delete (*iter).second;
    }
    delete werknemers;
    delete dieren;
    delete beschikbareDierNummers;
    delete beschikbareWerknemerNummers;
    delete kooien;
}

void Dierentuin::fillVectors() {

    for (int i = 1; i <= 10; i++) {
        beschikbareDierNummers->push_back(i);
        beschikbareWerknemerNummers->push_back(i);
    }
}

/*
 *   Dierentuin::getNaam()
 */
string Dierentuin::getNaam() {
    return de_naam;
}

/*
 *   Dierentuin::dierToevoegen()
 */
void Dierentuin::dierToevoegen(string dierNaam, int dierLeeftijd) {
    assert(dierLeeftijd >= 0);
    // maak een nieuw dier en stop het in de lijst van dieren
    int nr = getLaagsteBeschikbareNummer("dier");

    dieren->insert(map<int, Dier*>::value_type(nr, new Dier(dierNaam, dierLeeftijd)));
}

/*
 *   Dierentuin::dierVerwijderen()
 */
void Dierentuin::dierVerwijderen(int nummer) {
    assert(nummer > 0);
    if (dieren->count(nummer) != 0) {
        dieren->erase(nummer);
    } else {
        cout << "Dier niet gevonden, kies opnieuw" << endl;
        verwijderen("dier");
    }

    //Zet nummer terug in lijst op de goede plek
    beschikbareDierNummers->insert(beschikbareDierNummers->begin() + (nummer - 1), nummer);
}

int Dierentuin::getLaagsteBeschikbareNummer(string option) {
    int nr = -1;

    if (option == "dier") {
        nr = beschikbareDierNummers->at(0);
        beschikbareDierNummers->erase(beschikbareDierNummers->begin());
        
        if (hoogsteDierNummer < nr) {
            hoogsteDierNummer = nr;
        }
        
    } else if (option == "werknemer") {
        nr = beschikbareWerknemerNummers->at(0);
        beschikbareWerknemerNummers->erase(beschikbareWerknemerNummers->begin());

        if (hoogsteWerknemernummer < nr) {
            hoogsteWerknemernummer = nr;
        }
    }
    return nr;
}

Werknemer* Dierentuin::getWerknemer(int nummer){
    assert(nummer > 0);
    
    if (werknemers->count(nummer) != 0) {
        return werknemers->at(nummer);
    }
    
    return 0;
}

Dier* Dierentuin::getDier(int nummer){
    assert(nummer > 0);
    
    if (dieren->count(nummer) != 0) {
        return dieren->at(nummer);
    }
    
    return 0;
}

void Dierentuin::toevoegen(string option){
    if(option == "dier"){
        string dierNaam;
        int dierLeeftijd;

        cout << endl << "Geef op een regel, gescheiden door spatie(s)"
            " de naam en de leeftijd van het dier op"
            << endl;

        // lees de gegevens in
        cin >> dierNaam >> dierLeeftijd;
        dierToevoegen(dierNaam, dierLeeftijd);
    }
    else if(option == "werknemer"){
        string werknemerNaam;
        int werknemerLeeftijd;

        cout << endl << "Geef op een regel, gescheiden door spatie(s)"
                " de naam en de leeftijd van de werknemer op"
                << endl;

        // lees de gegevens in
        cin >> werknemerNaam >> werknemerLeeftijd;
        werknemerToevoegen(werknemerNaam, werknemerLeeftijd);
    }
}

void Dierentuin::verwijderen(string option){
    if(option == "dier"){
        int nummer;

        //print dieren
        overzichtDieren();

        cout << "Geef het nummer op van de werknemer die verwijderd moet worden" << endl;
        cin >> nummer;
        dierVerwijderen(nummer);
    }
    else if(option == "werknemer"){
        int nummer;

        //print werknemers
        overzichtWerknemers();

        cout << "Geef het nummer op van de werknemer die verwijderd moet worden" << endl;
        cin >> nummer;
        werknemerVerwijderen(nummer);
    }
}

/*
 *   Dierentuin::werknemerToevoegen()
 */
void Dierentuin::werknemerToevoegen(string werknemerNaam, int werknemerLeeftijd) {
    assert(werknemerLeeftijd > 15);
    // maak een nieuw dier en stop het in de lijst van dieren
    int nr = getLaagsteBeschikbareNummer("werknemer");
    
    werknemers->insert(map<int, Werknemer*>::value_type(nr, new Werknemer(werknemerNaam, werknemerLeeftijd)));
}

/*
 *   Dierentuin::werknemerVerwijderen()
 */
void Dierentuin::werknemerVerwijderen(int nummer) {
    assert(nummer > 0);
    if (werknemers->count(nummer) != 0) {
        werknemers->erase(nummer);
    } else {
        cout << "Werknemer niet gevonden, kies opnieuw" << endl;
        verwijderen("werknemer");
    }

    //Zet nummer terug in lijst op de goede plek
    beschikbareWerknemerNummers->insert(beschikbareWerknemerNummers->begin() + (nummer - 1), nummer);

}

/*
 *   Dierentuin::overzichtDieren()
 */
void Dierentuin::overzichtDieren() {
    cout << "Lijst van alle dieren" << endl;
    for (map<int, Dier*>::iterator iter = dieren->begin(); iter != dieren->end(); ++iter) {
        cout << (*iter).first << "\t";
        (*iter).second->drukaf();
    }
}

/*
 *   Dierentuin::overzichtWerknemers()
 */
void Dierentuin::overzichtWerknemers() {
    cout << "Lijst van alle werknemers" << endl;
    for (map<int, Werknemer*>::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
        cout << (*iter).first << "\t";
        (*iter).second->drukaf();
    }
}
